iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

先來複習一下,昨天,我們提到了類別(class)實體(instance),Ruby藉由實例化類別形成物件,並透過方法(method)來表現行為或與其他物件互動。今天,我們就來認識一下 方法(method) 是什麼。

定義

起手式:在 Ruby ,我們使用def...end來命名,通常是以英文小寫命名,如果名稱超過一個單詞則用底線連接。

class Note
  def clean_schedule
    puts "9:00 do the laundry"
  end
end

有些方法在使用或被使用的對象不同,需要帶入不同條件,我們會用傳入參數(parameter)的方式來執行,而參數可以有1個以上。

class Note
  def clean_schedule(day)
    puts "#{day} 9:00 do the laundry"
  end
end

Note.new.clean_schedule("Sunday")  # Sunday 9:00 do the laundry

此外,我們可以在定義方法時給定參數的預設值,呼叫方法時沒有帶入參數,就會使用預設值,有帶入參數,就使用帶入的參數。

class Note
  def clean_schedule(day = 'Sunday')
    puts "#{day} 9:00 do the laundry"
  end
end

Note.new.clean_schedule # Sunday 9:00 do the laundry
Note.new.clean_schedule("Friday")  # Friday 9:00 do the laundry

類別方法(class method)

方法綁定於類別本身而非類別的實例的方法,意思是當接收者不是物件而是類別本身時。要定義一個類別方法,需要在方法名稱前面加上self

class Product
  # 類別方法,建立一個新產品
  def self.create_product(name, price)
    puts "The #{name} is #{price}."
  end
end

Product.create_product("book", 300) # The book is 300.

另一種定義方式是使用def class << self...end,將self方法加到類別裡。

class Product
  # 類別方法,建立一個新產品
  def class << self
    def create_product(name, price)
      puts "The #{name} is #{price}."
    end
  end
end

Product.create_product("book", 300) # The book is 300.

使用時機

需要一個與類別相關的方法,而不需要存取類別的實例變數或方法時。這些方法通常用於執行一些操作,例如計算或轉換,而不需要實例化類別。

實體方法(instance method)

綁定於類別實例的方法,當接收者是物件時,類別被new成物件後使用的方法。

class Product
  attr_accessor :name, :price

  def initialize(name, price)
    @name = name
    @price = price
   end

  def on_sale
    puts "The product is 80% off."
  end
end

# 使用類別建立產品實體
product = Product.new('cake', 199)

puts "Product: #{product.name}, Price: $#{product.price}" # "Product: cake, Price: 199"
puts product.on_sale # "The product is 80% off."

使用時機

  • 用於處理類別的實例資料,通常與類別的實體相關聯,而非與類別關聯。它們可以存取實體變數和其他實體方法,以執行與特定實體物件相關的操作
  • 實體方法可以用來封裝物件的行為和功能,每個物件可以呼叫這些方法,以執行自己的操作。

總結

我們可以用類別的角度來思考,一個類別可以從兩個管道使用方法

  1. extend 模組(module) 的方法,成為本身可調用類別方法(class method) ; include 模組(module) 的方法,成為本身可調用實體方法(instance method)
  2. 類別,用自己類別裡定義的self方法。類別的物件實體,用自己類別裡定義的實體方法(instance method)

參考資料:


上一篇
Day22 Ruby物件導向實踐-類別與實體
下一篇
Day24 Ruby物件導向實踐-initialize 和attribute accessors
系列文
入坑 RoR 必讀 - Ruby 物件導向設計實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言